package com.example.kotlin.mvp;

import android.os.Bundle;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.example.kotlin.mvp.base.BasePresenter;
import com.example.kotlin.mvp.base.BaseView;
import com.example.kotlin.mvp.proxy.ActivityMvpProxy;
import com.example.kotlin.mvp.proxy.ActivityMvpProxyImpl;


/**
 * @author chenmengjia
 */
public abstract class BaseMvpActivityJava<P extends BasePresenter> extends AppCompatActivity implements BaseView {
    private P mPresenter;
    private ActivityMvpProxy activityMvpProxy;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView();
        // 创建 P，创建只能交给 子类，每个 Activity 都不一样
        mPresenter = createPresenter();
        mPresenter.attach(this);
        activityMvpProxy = createMvpProxy();
        // 1. Activity ？ Fragment? 1,2  ViewGroup ? 抽离  工具类抽出去，或者把代码每个地方 copy 一份
        // 今天你可以抽离目前的一部分：注入代码 + 额外功能 + 还有一些其他地方又不一样

//        // 这个地方要去注入 Presenter 通过反射 (Dagger) soEasy
//        Field[] fields = this.getClass().getDeclaredFields();
        activityMvpProxy.bindAndCreatePresenter();
        initView();
        initData();
    }

    protected ActivityMvpProxy createMvpProxy() {
        if (activityMvpProxy == null) {
            activityMvpProxy = new ActivityMvpProxyImpl<>(this);
        }
        return activityMvpProxy;
    }


    /**
     * @return
     */
    // 由子类去实现创建
    protected abstract P createPresenter();

    protected abstract void initData();

    protected abstract void initView();

    protected abstract void setContentView();

    @Override
    public void onDestroy() {
        super.onDestroy();
        // 一定要解绑
        activityMvpProxy.unbindPresenter();
        mPresenter.detach();
    }

    public P getPresenter() {
        return mPresenter;
    }
}
